package com.chinawlx.wlxteacher.network;


import com.chinawlx.wlxteacher.network.bean.WLXAboutFutrueStarBean;
import com.chinawlx.wlxteacher.network.bean.WLXCalendarBean;
import com.chinawlx.wlxteacher.network.bean.WLXClazzDynamicBean;
import com.chinawlx.wlxteacher.network.bean.WLXClazzHomeWorkBean;
import com.chinawlx.wlxteacher.network.bean.WLXClazzListBean;
import com.chinawlx.wlxteacher.network.bean.WLXCommentListBean;
import com.chinawlx.wlxteacher.network.bean.WLXCourseFinishedBean;
import com.chinawlx.wlxteacher.network.bean.WLXCourseManageBean;
import com.chinawlx.wlxteacher.network.bean.WLXGetCodeBean;
import com.chinawlx.wlxteacher.network.bean.WLXHomeWorkCommentBean;
import com.chinawlx.wlxteacher.network.bean.WLXHomeworkAddBean;
import com.chinawlx.wlxteacher.network.bean.WLXLogOffBean;
import com.chinawlx.wlxteacher.network.bean.WLXLoginBean;
import com.chinawlx.wlxteacher.network.bean.WLXRollCallBean;
import com.chinawlx.wlxteacher.network.bean.WLXScheduleChangeBean;
import com.chinawlx.wlxteacher.network.bean.WLXScheduleScoreBean;
import com.chinawlx.wlxteacher.network.bean.WLXSingleCourseBean;
import com.chinawlx.wlxteacher.network.bean.WLXStudentBean;
import com.chinawlx.wlxteacher.network.bean.WLXTimeLineBean;
import com.chinawlx.wlxteacher.network.bean.WLXUploadImagesBean;
import com.chinawlx.wlxteacher.network.bean.WLXUploadVideoBean;
import com.chinawlx.wlxteacher.utils.WLXConstant;

import java.util.Map;

import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.PartMap;
import retrofit2.http.Path;
import retrofit2.http.Streaming;
import retrofit2.http.Url;
import rx.Observable;

public interface WLXRxService {

//    @GET("rest/findUserForGet")
//    Observable<WLXGetCodeBean> findUserForGet(@Query("id") int id, @Query("username") String
// username,
//                                               @Query("address") String address);

    /**
     * 登陆时获取验证码接口
     *
     * @param mobile
     * @param type_code
     * @param timestamp
     * @param sign
     * @return
     */
    @FormUrlEncoded
    @POST(WLXConstant.CAPTCHA_URL)
    Observable<WLXGetCodeBean> getCode(@Field("mobile") String mobile, @Field("type_code") String
            type_code, @Field("timestamp") String timestamp, @Field("sign") String sign);

    /**
     * 登陆接口
     *
     * @param mobile
     * @param code
     * @param timestamp
     * @param sign
     * @return
     */
    @FormUrlEncoded
    @POST(WLXConstant.LOGIN_URL)
    Observable<WLXLoginBean> login(@Field("mobile") String mobile, @Field("code") String code,
                                   @Field("timestamp") String timestamp, @Field("sign") String
                                           sign);

    /**
     * 班级列表接口
     *
     * @param paging_index
     * @param paging_size
     * @return
     */
    @FormUrlEncoded
    @POST(WLXConstant.CLAZZ_LIST_URL)
    Observable<WLXClazzListBean> getClazzList(@Field("paging_index") String paging_index, @Field
            ("paging_size") String paging_size);

    /**
     * 获取班级作业列表
     *
     * @param paging_index
     * @param paging_size
     * @return
     */
    @FormUrlEncoded
    @POST(WLXConstant.CLASS_HOMEWORK + "{grade_id}")
    Observable<WLXClazzHomeWorkBean> getClassHomeWork(@Path("grade_id") String grade_id, @Field
            ("paging_index") String paging_index,
                                                      @Field("paging_size") String paging_size);


    /**
     * 课程管理接口
     *
     * @param grade_id
     * @param paging_index
     * @param paging_size
     * @return
     */
    @FormUrlEncoded
    @POST(WLXConstant.COURSE_MANAGE + "{grade_id}")
    Observable<WLXCourseManageBean> getCourseManage(@Path("grade_id") String grade_id, @Field
            ("paging_index") String paging_index, @Field("paging_size") String paging_size);

    /**
     * 单个作业回复列表
     */
    @FormUrlEncoded
    @POST(WLXConstant.HOMEWORK_COMMENT + "{homework_id}")
    Observable<WLXHomeWorkCommentBean> getHomeWorkComment(@Path("homework_id") String
                                                                  homework_id, @Field
                                                                  ("") String s);


    /**
     * 获取老师已点评被家长回复的作业列表
     *
     * @param grade_id
     * @return
     */
    @POST(WLXConstant.COMMENT_LIST + "{grade_id}")
    Observable<WLXCommentListBean> getCommentList(@Path("grade_id") String grade_id);

    /**
     * 获取教师的全部学生列表
     *
     * @return
     */
    @POST(WLXConstant.STUDENT_LIST)
    Observable<WLXStudentBean> getStudentAllList();

    /**
     * 获取班级动态
     *
     * @param grade_id
     * @param paging_index
     * @param paging_size
     * @return
     */
    @FormUrlEncoded
    @POST(WLXConstant.CLAZZ_DYNAMIC + "{grade_id}")
    Observable<WLXClazzDynamicBean> getClazzDynamic(@Path("grade_id") String grade_id, @Field
            ("paging_index") String paging_index, @Field("paging_size") String paging_size);

    /**
     * 获取课次统计
     *
     * @return
     */
    @POST(WLXConstant.LESSON_STATISTICS)
    Observable<ResponseBody> getLessonStatistics();

    /**
     * 更改昵称和qq号
     *
     * @param field_name
     * @param field_value
     * @return
     */
    @FormUrlEncoded
    @POST(WLXConstant.CHANGE_NICKNAME_AND_QQ)
    Observable<ResponseBody> changeNickNameAndQQ(@Field("field_name") String field_name, @Field
            ("field_value") String field_value);

    /**
     * 下载音频文件
     *
     * @param url 音频文件的URL
     * @return
     */
    @Streaming
    @GET()
    Call<ResponseBody> downLoadAudioFile(@Url String url);


    //上传语音文件,或者是
    @Multipart
    @POST(WLXConstant.COMMENT_TEACHER_ADD)
    Observable<WLXGetCodeBean> teacherCommentAdd(@Part("homework_id") RequestBody homework_id,
                                                 @Part("content") RequestBody content,
                                                 @Part("content_code") RequestBody content_code,
                                                 @Part("duration") RequestBody duration,
                                                 @Part MultipartBody.Part file);

    //教师发送文字信息
    @FormUrlEncoded
    @POST(WLXConstant.COMMENT_TEACHER_ADD)
    Observable<WLXGetCodeBean> teacherCommentAddText(@Field("homework_id") String homework_id,
                                                     @Field("content") String content,
                                                     @Field("content_code") String content_code);

    /**
     * 上传教师头像
     */
    @Multipart
    @POST(WLXConstant.UPDATE_TEACHER_AVATAR)
    Observable<WLXGetCodeBean> uploadTeacherAvatar(@Part MultipartBody.Part
                                                           file);

    /**
     * 课程内容-图片举报
     */
    @FormUrlEncoded
    @POST(WLXConstant.REPORT_CREATE)
    Observable<WLXGetCodeBean> reportCreate(@Field("resource_id") String resource_id, @Field
            ("resource_code") String resource_code, @Field("content") String content);


    //    //上传单个文件
//    @Multipart
//    @POST("rest/upload")
//    Observable<ResponseBody> upload(@Part("username") RequestBody username, @Part("address")
// RequestBody address,
//                                    @Part MultipartBody.Part file);

    /**
     * 登出账号
     *
     * @return
     */
    @POST(WLXConstant.LOG_OFF)
    Observable<WLXLogOffBean> logoff();

    /**
     * 关于未来星
     *
     * @return
     */
    @GET(WLXConstant.ABOUT_FUTURESTAR_URL)
    Observable<WLXAboutFutrueStarBean> aboutFutureStar();

    /**
     * 点名
     * <p/>
     * 情况1:student_ids为空时,请求url如下
     * <p/>
     * /study/:grade_id/:schedule_id
     *
     * @return
     */
    @FormUrlEncoded
    @POST(WLXConstant.CALL_ROLL + "{grade_id}" + "/" + "{schedule_id}" + "/rollcall")
    Observable<WLXRollCallBean> callRollIdsNull(@Path("grade_id") String grade_id, @Path
            ("schedule_id")
            String schedule_id, @Field("student_ids") String student_ids);

    /**
     * 点名
     * <p/>
     * 情况1:student_ids不为空时,请求url如下
     * <p/>
     * /study/:grade_id/:schedule_id/rollcall
     *
     * @return
     */
    @FormUrlEncoded
    @POST(WLXConstant.CALL_ROLL + "{grade_id}" + "/" + "{schedule_id}" + "/rollcall")
    Observable<WLXRollCallBean> callRollIdsNotNull(@Path("grade_id") String grade_id, @Path
            ("schedule_id")
            String schedule_id, @Field("student_ids") String student_ids);


    /**
     * 获取学生课程表列表(日历数据)
     */
    @FormUrlEncoded
    @POST(WLXConstant.SCHEDULE_STUDENTGRADE_ALL)
    Observable<WLXCalendarBean> schedule(@Field("min_date") String min_date, @Field
            ("max_date") String max_date);


    /**
     * 调整课次
     *
     * @param grade_id       班级ID
     * @param schedule_id    课程表id
     * @param reason_code    请假原因编码
     * @param new_start_date 新的开始日期（格式：2016-04-01 10:30:00）
     * @param new_end_date   新的结束日期（格式：2016-04-01 12:30:00）
     * @return
     */
    @FormUrlEncoded
    @POST(WLXConstant.ADJUST_LESSON + "{grade_id}")
    Observable<WLXGetCodeBean> adjustLesson(@Path("grade_id") String grade_id, @Field
            ("schedule_id") String schedule_id,
                                            @Field("reason_code") String reason_code, @Field
                                                    ("new_start_date") String new_start_date,
                                            @Field("new_end_date") String new_end_date);


    /**
     * 教师请假
     *
     * @param grade_id    班级ID
     * @param schedule_id 课程表ID
     * @param reason_code 请假原因
     * @return
     */
    @FormUrlEncoded
    @POST(WLXConstant.TEACHER_LEAVE + "{grade_id}")
    Observable<WLXGetCodeBean> teacherLeave(@Path("grade_id") String grade_id, @Field
            ("schedule_id") String schedule_id,
                                            @Field("reason_code") String reason_code);

    /**
     * 班级停课
     *
     * @param grade_id    班级ID
     * @param reason_code 原因
     * @param start_date  开始时间
     * @param end_date    结束日期（格式：2016-05-01）
     * @return
     */
    @FormUrlEncoded
    @POST(WLXConstant.SCHEDULE_CHANGE_STOP + "{grade_id}")
    Observable<WLXGetCodeBean> scheduleStopGrade(@Path("grade_id") String grade_id,
                                                 @Field("reason_code") String reason_code,
                                                 @Field("start_date") String start_date,
                                                 @Field("end_date") String end_date
    );

    /**
     * 某个班级的某个学生停课
     *
     * @param grade_id    班级ID
     * @param student_id  学生ID
     * @param reason_code 原因编码
     * @param start_date  开始
     * @param end_date    结束日期（格式：2016-05-01）
     * @return
     */
    @FormUrlEncoded
    @POST(WLXConstant.SCHEDULE_CHANGE_STOP + "{grade_id}" + "/" + "{student_id}")
    Observable<WLXGetCodeBean> scheduleStopStudent(@Path("grade_id") String grade_id,
                                                   @Path("student_id") String student_id,
                                                   @Field("reason_code") String reason_code,
                                                   @Field("start_date") String start_date,
                                                   @Field("end_date") String end_date
    );

    /**
     * 学生加课
     *
     * @param grade_id   班级ID
     * @param student_id 学生ID
     * @param week       星期几（1:星期一，2:星期二...7：星期天）
     * @param start_time 开始时间（12:00:00）
     * @param end_time
     * @param start_date 开始日期（2016-04-01）
     * @param end_date
     * @return
     */
    @FormUrlEncoded
    @POST(WLXConstant.SCHEDULE_CHANGE_addition + "{grade_id}" + "/" + "{student_id}")
    Observable<WLXGetCodeBean> scheduleChangeAddStudent(@Path("grade_id") String grade_id,
                                                        @Path("student_id") String student_id,
                                                        @Field("week") String week,
                                                        @Field("start_time") String start_time,
                                                        @Field("end_time") String end_time,
                                                        @Field("start_date") String start_date,
                                                        @Field("end_date") String end_date
    );

    /**
     * 班级加课
     *
     * @param grade_id
     * @param week
     * @param start_time
     * @param end_time
     * @param start_date
     * @param end_date
     * @return
     */
    @FormUrlEncoded
    @POST(WLXConstant.SCHEDULE_CHANGE_addition + "{grade_id}")
    Observable<WLXGetCodeBean> scheduleChangeAddGrade(@Path("grade_id") String grade_id,
                                                      @Field("week") String week,
                                                      @Field("start_time") String start_time,
                                                      @Field("end_time") String end_time,
                                                      @Field("start_date") String start_date,
                                                      @Field("end_date") String end_date
    );

    /**
     * 发送课程内容文字信息
     *
     * @param schedule_id
     * @param content
     * @return
     */
    @FormUrlEncoded
    @POST(WLXConstant.SCHEDULE_SETCONTENT + "{schedule_id}")
    Observable<WLXGetCodeBean> scheduleSetcontent(@Path("schedule_id") String schedule_id, @Field
            ("content") String content);

    /**
     * 上传图片
     *
     * @return
     */
    @Multipart
    @POST(WLXConstant.UPLOAD_IMAGE)
    Observable<WLXUploadImagesBean> uploadImages(@PartMap Map<String, RequestBody> params);

    /**
     * 获取时间线数据
     */
    @FormUrlEncoded
    @POST(WLXConstant.TIMELINE_URL + "{student_id}/{grade_id}")
    Observable<WLXTimeLineBean> timeLine(@Path("student_id") String student_id, @Path("grade_id")
            String grade_id, @Field("paging_index") int paging_index, @Field("paging_size") int
                                                 paging_size);

    /**
     * 上传视频(交作业)
     */
    @Multipart
    @POST(WLXConstant.UPLOAD_VIDEO)
    Observable<WLXUploadVideoBean> uploadVideo(@Part("resource_id") RequestBody resourceId, @Part
            ("resource_code") RequestBody resourceCode, @Part("duration") RequestBody
                                                       videoDuration, @Part MultipartBody.Part
                                                       file);

    /**
     * 交视频作业前HOMEWORK_ADD
     * (不携带schedule_id)
     */
    @FormUrlEncoded
    @POST(WLXConstant.HOMEWORK_ADD)
    Observable<WLXHomeworkAddBean> homeworkAddForVideo(@Field("student_id") String student_id,
                                                       @Field("grade_id") String grade_id, @Field
                                                               ("content") String content, @Field
                                                               ("content_code") String
                                                               content_code);

    /**
     * 交图片作业前HOMEWORK_ADD
     */
    @FormUrlEncoded
    @POST(WLXConstant.HOMEWORK_ADD)
    Observable<WLXHomeworkAddBean> homeworkAddForImage(@Field("student_id") String student_id,
                                                       @Field("grade_id") String grade_id, @Field
                                                               ("content") String content, @Field
                                                               ("content_code") String
                                                               content_code, @Field
                                                               ("image_count") String image_count);

    /**
     * 结课
     */
    @POST(WLXConstant.FINISHED + "{grade_id}" + "/" + "{schedule_id}")
    Observable<WLXCourseFinishedBean> courseFinished(@Path("grade_id") String grade_id, @Path
            ("schedule_id") String schedule_id);

    /**
     * 单个课程请求
     *
     * @param schedule_id
     * @return
     */
    @POST(WLXConstant.SINGLE_COURSE + "{schedule_id}")
    Observable<WLXSingleCourseBean> getSingleCourse(@Path("schedule_id") String schedule_id);

    /**
     * 获取教师某个课程表课次的差评列表
     *
     * @param schedule_id
     * @return
     */
    @POST(WLXConstant.BAD_LIST + "{schedule_id}")
    Observable<WLXScheduleScoreBean> getBadList(@Path("schedule_id") String schedule_id);

    /**
     * 获取课程改变信息
     *
     * @return
     */
    @POST(WLXConstant.SCHEDULE_CHANGE + "{teacher_change_id}")
    Observable<WLXScheduleChangeBean> getScheduleChange(@Path("teacher_change_id") String
                                                                teacher_change_id);
}
